﻿Imports System.Text
Imports System.Globalization

''' <summary>
''' スネークケース書式変換器
''' </summary>
''' <remarks></remarks>
Public NotInheritable Class SnakeCaseFormatter

    Private Sub New()
    End Sub

    Const DELIMITER As String = "_"

    ''' <summary>
    ''' スネークケース書式に変換します
    ''' </summary>
    ''' <param name="name"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function ToSnakeCase(name As String) As String
        If name Is Nothing Then Return String.Empty

        Dim s As New StringBuilder

        Dim isPrevUpper As Boolean = True
        For Each item In name
            If Char.IsUpper(item) Then
                '1つ前の文字が大文字なら、そのまま結合
                'それ以外は単語区切り記号を追加してから結合
                If isPrevUpper = False Then s.Append(DELIMITER)
                s.Append(item)
                isPrevUpper = True
            ElseIf Char.IsLower(item) Then
                s.Append(Char.ToUpper(item))
                isPrevUpper = False
            Else
                '#83　「#80の命名規則がOracle書式で正しく動作しない」Fix
                '記号はそのまま使用する。
                s.Append(item)
                isPrevUpper = True
            End If
        Next

        Return s.ToString
    End Function

End Class
